gusucode.com > 支持向量机工具箱 - LIBSVM OSU_SVM LS_SVM源码程序 > 支持向量机工具箱 - LIBSVM OSU_SVM LS_SVM\LS_SVMlab\tunelssvm.m

    function [model,cost,O3] = tunelssvm(model,startvalues, varargin);
% Tune the hyperparameters of the model with respect to the given performance measure
%
% 1. Using the functional interface:
%
%
% >> [gam, sig2, cost] = tunelssvm({X,Y,type,igam,isig2,kernel,preprocess})
% >> [gam, sig2, cost] = tunelssvm({X,Y,type,igam,isig2,kernel,preprocess}, StartingValues)
% >> [gam, sig2, cost] = tunelssvm({X,Y,type,igam,isig2,kernel,preprocess},...
%                                          StartingValues, optfun, optargs)
% >> [gam, sig2, cost] = tunelssvm({X,Y,type,igam,isig2,kernel,preprocess},...
%                                          StartingValues, optfun, optargs, costfun, costargs)
%
%      Outputs    
%        gam     : Optimal regularization parameter
%        sig2    : Optimal kernel parameter(s)
%        cost(*) : Estimated cost of the optimal hyperparameters
%      Inputs    
%        X       : N x d matrix with the inputs of the training data
%        Y       : N x 1 vector with the outputs of the training data
%        type    : 'function estimation' ('f') or 'classifier' ('c')
%        igam    : Starting value of the regularization parameter
%        isig2   : Starting value of the kernel parameter(s) (bandwidth in the case of the 'RBF_kernel')
%        kernel(*) : Kernel type (by default 'RBF_kernel')
%        preprocess(*) : 'preprocess'(*) or 'original'
%        StartingValues(*) : Starting values of the optimization routine (or '[]')
%        optfun(*) : Optimization function (by default 'gridsearch')
%        optargs(*) : Cell with extra optimization function arguments
%        costfun(*) : Function estimating the cost-criterion (by default 'crossvalidate')
%        costargs(*) : Cell with extra cost function arguments
%
% 2. Using the object oriented interface:
%
% >> [model, cost] = tunelssvm(model)
% >> [model, cost] = tunelssvm(model, StartingValues)
% >> [model, cost] = tunelssvm(model, StartingValues, optfun, optargs)
% >> [model, cost] = tunelssvm(model, StartingValues, optfun, optargs, costfun, costargs)
%
%      Outputs    
%        model            : Object oriented representation of the LS-SVM model with optimal hyperparameters
%        cost(*)          : Estimated cost of the optimal hyperparameters
%      Inputs    
%        model            : Object oriented representation of the LS-SVM model with initial hyperparameters
%        StartingValues(*): Starting values of the optimization routine (or '[]')
%        optfun(*)        : Optimization function (by default 'gridsearch')
%        optfun(*)        : Cell with extra optimization function arguments
%        costfun(*)       : Function estimating the cost-criterion (by default 'crossvalidate')
%        optfun(*)        : Cell with extra cost function arguments
%
%  See also:
%    trainlssvm, crossvalidate, validate, gridsearch, linesearch


  
% Copyright (c) 2002,  KULeuven-ESAT-SCD, License & help @ http://www.esat.kuleuven.ac.be/sista/lssvmlab


    
%
% starting values
%
try,
  if ~isnumeric(startvalues),
    warning('Startingvalues has to be in a matrix');
  end
catch
end
  
%
% initiate variables
%
if iscell(model),
  model = initlssvm(model{:});
  func=1;
else
  func=0;
end
model = trainlssvm(model);



%
% defaults
%
if length(varargin)>=1, optfun  = varargin{1}; else optfun='gridsearch';end
if length(varargin)>=2, optargs = varargin{2}; else optargs = {}; end
if length(varargin)>=3, 
  costfun = varargin{3}; 
  if length(varargin)>=4, costargs = varargin{4}; 
  else 
    costargs ={}; 
    if strcmp(costfun,'crossvalidate') | strcmp(costfun,'rcrossvalidate') |strcmp(costfun,'leaveoneout'),
      eval('[X,Y]=postlssvm(model,model.xtrain, codelssvm(model,model.ytrain));costargs = {X,Y};',...
           '[X,Y]=postlssvm(model,model.xtrain, model.ytrain);costargs = {X,Y};')

    end
  end
else 
  costfun= 'crossvalidate'; 
  eval('[X,Y]=postlssvm(model,model.xtrain, codelssvm(model,model.ytrain));costargs = {X,Y};',...
       '[X,Y]=postlssvm(model,model.xtrain, model.ytrain);costargs = {X,Y};')
end






%
% multiple outputs
if (model.y_dim>1)% & (size(model.kernel_pars,1)==model.y_dim |size(model.gam,1)==model.y_dim |prod(size(model.kernel_type,1))==model.y_dim))
  disp(' -->> tune individual outputs');
  for d=1:model.y_dim,
    fprintf(['\n -> dim ' num2str(d) ': \n']);
    eval('gam = model.gam(:,d);','gam = model.gam;');
    eval('sig2 = model.kernel_pars(:,d);','sig2 = model.kernel_pars;');
    eval('kernel = model.kernel_type{d};','kernel=model.kernel_type;');
    [g,s,c] = ...
        tunelssvm({model.xtrain,model.ytrain(:,d),...
                   model.type,gam,sig2,kernel,'original'},...
                  [],varargin{:});
    gamt(:,d) = g;
    eval('kernel_part(:,d) = s;','kernel_part = []; ');
    costs(d) = c;
  end
  model.gam = gamt;
  model.kernel_pars = kernel_part;
  if func,
    O3 = costs;
    cost = model.kernel_pars;
    model = model.gam;
  end
  return  
end


if length(model.gam)>1, 
  error('Only one gamma per output allowed'); 
end



%
% depending on kernel
%

%
% lineare kernel
%
if strcmp(model.kernel_type,'lin_kernel'),

  optfun = 'linesearch';
  disp(' TUNELSSVM: chosen specifications:');
  disp([' 1. optimization routine:           ' optfun]);
  disp(['    cost function:                  ' costfun]);
  disp(' ');
  eval('startvalues = log(startvalues);','startvalues = [];');
  if isempty(startvalues),
    startvalues = log(model.gam)+[-5;10];
  end
  
  tic;
  c = costofmodel1(startvalues(1),model,costfun,costargs);
  et = toc; 
  disp([' 2. starting values:                   ' num2str(exp(startvalues(1,:)))]);
  disp(['    cost of starting values:           ' num2str(c)]);
  disp(['    time needed for 1 evaluation (sec):' num2str(et)]);
  disp(['    limits of the grid:   [gam]         ' num2str(exp(startvalues(:,1))')]);
  disp(' ');
  disp('OPTIMIZATION IN LOG SCALE...');
  
  %
  % major call
  [gs, cost,evals, fig] = feval(optfun, @costofmodel1,startvalues,{model, costfun,costargs},optargs{:});
  figure(fig);
  xlabel('log(gamma)');
  ylabel(costfun);
  
  gamma = exp(gs(1));
  kernel_pars = [];
  disp(['Obtained hyper-parameters: [gamma]: ' num2str([gamma])]);


%
% RBF kernel
%
elseif strcmp(model.kernel_type,'RBF_kernel'),
  
  
  disp(' TUNELSSVM: chosen specifications:');
  disp([' 1. optimization routine:           ' optfun]);
  disp(['    cost function:                  ' costfun]);
  disp(' ');  
  eval('startvalues = log(startvalues);','startvalues = [];');
  if isempty(startvalues),
    startvalues = [log(model.gam)+[-3;5] log(model.kernel_pars)+[-2.5;2.5]];
  end
  
  tic;
  c = costofmodel2(startvalues(1,:),model,costfun,costargs);
  et = toc; 
  disp([' 2. starting values:                   ' num2str(exp(startvalues(1,:)))]);
  disp(['    cost of starting values:           ' num2str(c)]);
  disp(['    time needed for 1 evaluation (sec):' num2str(et)]);
  disp(['    limits of the grid:   [gam]         ' num2str(exp(startvalues(:,1))')]);
  disp(['                          [sig2]        ' num2str(exp(startvalues(:,2))')]);
  disp(' ');
  disp('OPTIMIZATION IN LOG SCALE...');
  [gs, cost, evals, fig] = feval(optfun,@costofmodel2,startvalues,{model, costfun,costargs},optargs{:});
  
  figure(fig);
  xlabel('log(\gamma)');
  ylabel('log(\sigma^2)');
  zlabel(costfun);
  gamma = exp(gs(1));
  kernel_pars = exp(gs(2:end))';  
  
  
  disp(['Obtained hyper-parameters: [gamma sig2]: ' num2str([gamma kernel_pars])]);
  
  
%
% polynoom kernel
%
elseif strcmp(model.kernel_type,'poly_kernel'),

  dg = model.kernel_pars(2);
  disp(' TUNELSSVM: chosen specifications:');
  disp([' 1. optimization routine:           ' optfun]);
  disp(['    cost function:                  ' costfun]);
  disp(' ');  
  eval('startvalues = log(startvalues);','startvalues = [];');
  if isempty(startvalues),
    startvalues = [log(model.gam)+[-3;5] log(model.kernel_pars(1))+[-2.5;2.5]];
  end
  
  tic;
  c = costofmodel3(startvalues(1,:),dg,model,costfun,costargs);
  et = toc; 
  disp([' 2. starting values:                   ' num2str([exp(startvalues(1,:)) dg])]);
  disp(['    cost of starting values:           ' num2str(c)]);
  disp(['    time needed for 1 evaluation (sec):' num2str(et)]);
  disp(['    limits of the grid:   [gam]         ' num2str(exp(startvalues(:,1))')]);
  disp(['                          [t]           ' num2str(exp(startvalues(:,2))')]);
  disp(['                          [degree]      ' num2str(dg)]);
  disp('OPTIMIZATION IN LOG SCALE...');
  [gs, cost, evals, fig] = feval(optfun,@costofmodel3,startvalues,{dg,model, costfun,costargs},optargs{:});

  figure(fig);
  xlabel('log(\gamma)');
  ylabel('log(t)');
  zlabel(costfun);
  
  gamma = exp(gs(1));
  kernel_pars = [exp(gs(2:end));dg];
  
  disp(['Obtained hyper-parameters: [gamma t degree]: ' num2str([gamma kernel_pars'])]);

else
  warning('Tuning for other kernels is not actively supported,  see ''gridsearch'' and ''linesearch''.')
end
model.cga_startvalues = [];



if func,
  O3 = cost;
  eval('cost = [kernel_pars;degree];','cost = kernel_pars;');
  model = gamma;
else
  model = changelssvm(changelssvm(model,'gam',exp(gs(1))),'kernel_pars',exp(gs(2:end)));
end



function cost =  costofmodel1(gs, model,costfun,costargs)
  gam = exp(min(max(gs(1),-50),50));
  modelf = changelssvm(model,'gam',gam);
  cost = feval(costfun,modelf,costargs{:});

  
function cost =  costofmodel2(gs, model,costfun,costargs)
  gam = exp(min(max(gs(1),-50),50));
  sig2 = zeros(length(gs)-1,1);
  for i=1:length(gs)-1, sig2(i,1) = exp(min(max(gs(1+i),-50),50)); end
  modelf = changelssvm(changelssvm(model,'gam',gam),'kernel_pars',sig2);
  cost = feval(costfun,modelf,costargs{:});

  
function cost =  costofmodel3(gs,d, model,costfun,costargs)
  gam = exp(min(max(gs(1),-50),50));
  sig2 = exp(min(max(gs(2),-50),50));
  modelf = changelssvm(changelssvm(model,'gam',gam),'kernel_pars',[sig2;d]);
  cost = feval(costfun,modelf,costargs{:});